package br.ucb.cesbdao.model.impl;

import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;

import javax.swing.JLabel;

import lombok.Getter;
import lombok.Setter;

import org.apache.log4j.Logger;

import br.ucb.cesbdao.beans.Acesso;
import br.ucb.cesbdao.beans.Pessoa;
import br.ucb.cesbdao.beans.Trabalhador;
import br.ucb.cesbdao.enuns.EnumMensagens;
import br.ucb.cesbdao.model.TrabalhadorModel;
import br.ucb.cesbdao.modeloTabelas.ModeloTabelaAtendenteApoio;
import br.ucb.cesbdao.persistencia.dao.AcessoDAO;
import br.ucb.cesbdao.persistencia.dao.PessoaDAO;
import br.ucb.cesbdao.persistencia.dao.TrabalhadorDAO;
import br.ucb.cesbdao.persistencia.factory.FactoryConnection;
import br.ucb.cesbdao.persistencia.factory.FactoryDAO;
import br.ucb.cesbdao.servicos.EncriptaSenha;
import br.ucb.cesbdao.servicos.Servicos;
import br.ucb.cesbdao.visao.Visao;

public class TrabalhadorModelImpl implements TrabalhadorModel{

	private Logger logger = Servicos.carregaLog(TrabalhadorModelImpl.class);
	@Getter @Setter
	private TrabalhadorDAO dao;

	public TrabalhadorModelImpl() {
	}

	@Override
	public void addTrabalhador(Trabalhador atendente, String senha) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			PessoaModelImpl pm = new PessoaModelImpl();
			pm.addPessoa(new Pessoa(atendente));
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			getDao().addTrabalhador(atendente, EncriptaSenha.encripta(senha));
			//SENHA PADRÃO. DATA DE NASCIMENTO
			AcessoModelImpl am = new AcessoModelImpl();
			am.addAcesso(new Acesso(atendente.getCpf(),atendente.getDataNascimento().replace("-","")));
			
			Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_CADASTRO_SUCESSO.getMensagem(), "Sucesso");
		} catch (ClassNotFoundException | SQLException e) { 
			logger.error(e.getMessage());
			e.printStackTrace();
			Visao.showMessage(EnumMensagens.MSG_ERRO_CADASTRO.getMensagem(), "Erro");
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
	}

	@Override
	public void deletaTrabalhador(int id) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			getDao().deletaTrabalhador(id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
	}

	@Override
	public ArrayList<Trabalhador> consultaAllTrabalhador() {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaAllTrabalhador();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Trabalhador> consultaAllTrabalhadorByTipo(String tipo) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaAllTrabalhadorByTipo(tipo);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public ArrayList<Trabalhador> consultaTrabalhadorByStatus() {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaTrabalhadorByStatus();
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public Trabalhador consultaTrabalhador(String nome) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaTrabalhador(nome);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public Trabalhador consultaTrabalhador(Integer id) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaTrabalhador(id);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public Trabalhador consultaTrabalhadorByCpf(String cpf) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			return getDao().consultaTrabalhadorByCpf(cpf);
		} catch (ClassNotFoundException | SQLException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return null;
	}

	@Override
	public boolean alteraTrabalhador(Trabalhador atendente) {
		try {
			PessoaDAO pessoaDao = new PessoaDAO(FactoryConnection.getInstance().criaConexao());
			pessoaDao.alteraPessoa(new Pessoa(atendente.getId(),atendente.getNome(),atendente.getSexo(),atendente.getStatus()));
			
			AcessoDAO acessoDao = new AcessoDAO(FactoryConnection.getInstance().criaConexao());
			acessoDao.alteraAcesso(new Acesso(atendente.getCpf(), atendente.getDataNascimento().replace("-","")));
			
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			getDao().alteraTrabalhador(atendente);
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return false;
	}

	@Override
	public boolean inativaTrabalhador(Integer id) {
		try {
			setDao(FactoryDAO.getDaoTrabalhador(FactoryConnection.getInstance().criaConexao()));
			Trabalhador atendente = getDao().consultaTrabalhador(id);
			if(atendente.getStatus()=='A'){
				if (Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_INATIVAR_AA.getMensagem(), "Atenção")){
					atendente.setStatus('I');
					getDao().inativaTrabalhador(atendente);
					Visao.showMessage(EnumMensagens.MSG_Q_CONFIRMACAO_INATIVAR_AA.getMensagem(), "Atenção");
					return true;
				}
				return false;

			}else{
				Visao.showMessage(EnumMensagens.MSG_ALERTA_PESSOA_INATIVO.getMensagem(),"Atenção");
			}
		}catch(SQLException | ClassNotFoundException e){
			e.printStackTrace();
			logger.error(e.getMessage());
		} finally {
			FactoryConnection.getInstance().closeConexao(getDao().getConexao());
		}
		return false;
	}

	@Override
	public void qntAfisAtendimento(JLabel lblQtdafis,ModeloTabelaAtendenteApoio modeloTabelaTrabalhador){
		DecimalFormat dc = new DecimalFormat("00");
		lblQtdafis.setText(String.valueOf(dc.format(modeloTabelaTrabalhador.getQntAtendendoAt())));
	}
}
